package com.example.jvm.lesson11;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Date 2024-01-22
 * @Author Jonathan
 * 调用thenRun方法执行第二个任务时，则第二个任务和第一个任务是共用同一个线程池。
 * 调用thenRunAsync执行第二个任务时，则第一个任务使用的是你自己传入的线程池，第二个任务使用的是ForkJoin线程池
 */
public class FutureTest6 {

    private static final Logger log = LoggerFactory.getLogger(FutureTest6.class);
    static ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1000));
    public static void main(String[] args) throws Exception {
        // 这种就是串行执行
        CompletableFuture<String> apply = CompletableFuture.supplyAsync(() -> {
            log.info("任务第一步");
            return "hello world";
        },executor).thenApply((str) -> {
            log.info("第一步的任务结果是:{}", str);
            return "这是第二个任务的结果";
        });
        log.info("apply.get():{}", apply.get());
    }
}
